package jsp;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;

public class DemoTag implements Tag {//tag接口，未成功,抽象类中有其他方法的操作
    /**
     * 接受传递进来的pageContext
     */
    private PageContext pageContext;

    /**
     * JSP引擎实例化标签处理器后，将调用setPageContext方法将JSP页面的pageContext对象传递给标签处理器，
     * 标签处理器以后可以通过这个pageContext对象与JSP页面进行通信
     */
    @Override
    public void setPageContext(PageContext pageContext) {
        this.pageContext = pageContext;
    }

    @Override
    public void setParent(Tag tag) {

    }

    @Override
    public Tag getParent() {
        return null;
    }

    /**
     * 调用setPageContext方法和setParent方法之后，WEB容器执行到自定义标签的开始标记时，
     * 就会调用标签处理器的doStartTag 方法
     */
    @Override
    public int doStartTag() throws JspException {
        System.out.println("调用doStartTag()方法");
        HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
        JspWriter jw = pageContext.getOut();
        String ip = request.getRemoteAddr();
        try {
            jw.write(ip);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    /**
     * WEB容器执行完自定义标签的标签体后，就会接着去执行自定义标签的结束标记，
     * 此时，WEB容器会去调用标签处理器的doEndTag方法
     */
    @Override
    public int doEndTag() throws JspException {
        System.out.println("调用doEndTag()方法");
        return 0;
    }

    @Override
    public void release() {
        System.out.println("调用release()方法");
    }
}
